package org.example.Utils;

import org.example.TankGan.Recorder;
import org.example.TankGan.pojo.MyHeroTank.MyHero;
import org.example.TankGan.pojo.Boom;
import org.example.TankGan.pojo.Enemy.EnemyTank;
import org.example.TankGan.pojo.Tank;

import java.awt.*;
import java.awt.image.ImageObserver;
import java.util.Vector;

/**
 * @author cc
 * @date 2021/4/17 12:10
 * @Description 画坦克的封装类
 */

//编写方法，画坦克
public  class DrawAll {
    private static int temp=0;


    /**
     * @author cc
     * @date 2021/4/17 12:10
     * @Description 画坦克的封装类
     * @author sosmcc
     * @param x 坦克的左上角x坐标
     * @param y 坦克的左上角y坐标
     * @param g 画笔
     * @param drection 坦克的方向（上下左右）
     * @param type 坦克的种类（敌人还是自己）
     */
    public static void  DrawTank(int x, int y, Graphics g, int drection, int type){
        switch (type){
            case 0: //自己的坦克
                g.setColor(Color.cyan);//自己坦克青色
                break;
            case 1: //敌人坦克
                g.setColor(Color.yellow); //黄色
                break;
        }
        //根据坦克方向绘制坦克
        //0 :向上 1:向右 2:向下 3：向左
        switch (drection){
            case 0: //0表示向上
                g.fill3DRect(x,y,10,60,false);//画左边轮子
                g.fill3DRect(x+30,y,10,60,false);//右边的轮子
                g.fill3DRect(x+10,y+10,20,40,false);//画主体
                g.fillOval(x+10,y+20,20,20);//画转盘
                g.drawLine(x+20,y+30,x+20,y);//炮管
                break;
            case 1:
                g.fill3DRect(x,y,60,10,false);//左轮子
                g.fill3DRect(x,y+30,60,10,false);//右轮子
                g.fill3DRect(x+10,y+10,40,20,false);//主体
                g.fillOval(x+20,y+10,20,20);//转盘
                g.drawLine(x+30,y+20,x+60,y+20);
                break;
            case 2:
                g.fill3DRect(x,y,10,60,false);//画左边轮子
                g.fill3DRect(x+30,y,10,60,false);//右边的轮子
                g.fill3DRect(x+10,y+10,20,40,false);//画主体
                g.fillOval(x+10,y+20,20,20);//画转盘
                g.drawLine(x+20,y+30,x+20,y+60);//炮管
                break;
            case 3:
                g.fill3DRect(x,y,60,10,false);//左轮子
                g.fill3DRect(x,y+30,60,10,false);//右轮子
                g.fill3DRect(x+10,y+10,40,20,false);//主体
                g.fillOval(x+20,y+10,20,20);//转盘
                g.drawLine(x+30,y+20,x,y+20);
                break;
            default:
                System.out.println("暂时没用处理");
        }
    }

    /**
     *
     * @author sosmcc
     * @param x 子弹左上角x坐标
     * @param y 子弹左上角y的坐标
     * @param drection 子弹的方向（上下左右）
     * @param type 子弹的种类
     * @param g 画图的g
     */
    private  static   void DrawBullet(int x,int y,int drection,int type,Graphics g){
        //0：自己 1：敌人
        switch (type)
        {
            case 0:
                g.setColor(Color.red);
                break;
            case 1:
                g.setColor(Color.white);
                break;
        }
        switch (drection){
            case 0:
//                g.fill3DRect(x+20,y,6,10,false);
//                g.drawLine(x+20,y,x+23,y-5);
//                g.drawLine(x+26,y,x+23,y-5);
                g.drawOval(x,y-20,6,10);
                break;
            case 1:
                g.drawOval(x,y,10,6);
//                g.drawLine(x+70,y+20,x+75,y+23);
//                g.drawLine(x+70,y+26,x+75,y+23);
                break;
            case 2:
                g.drawOval(x,y,6,10);
//                g.drawLine(x+20,y+70,x+23,y+75);
//                g.drawLine(x+26,y+70,x+23,y+75);
                break;
            case 3:
                g.drawOval(x,y,10,6);
//                g.drawLine(x,y+20,x-5,y+23);
//                g.drawLine(x,y+26,x-5,y+23);
                break;

        }
    }
    public static void DrawBoom(int x, int y, Graphics g, Image image, ImageObserver t){
        g.drawImage(image,x,y,60,60,t);
    }

    /**
     * @Description: 画自己的坦克
     * @author sosmcc
     * @param myHero 你自己的坦克封装类
     * @param g 画图的g
     */
    public static void DrawTankMyHero(MyHero myHero, Graphics g) {
        if (myHero.isIstrue()){
            DrawTank(myHero.getX(),myHero.getY(),g,myHero.getDrection(),myHero.getType());

        } else {
            System.out.println("没写");
        }
    }

    /**
     * @Description: 画单个的坦克
     * @author sosmcc
     * @param enemyTank 你自己的坦克封装类
     * @param g 画图的g
     */
    public static void DrawTankEnemy(EnemyTank enemyTank, Graphics g) {
        DrawTank(enemyTank.getX(),enemyTank.getY(),g,enemyTank.getDrection(),enemyTank.getType());
    }

    /**
     * @Description: 画子弹
     * @author sosmcc
     * @param tank 你自己的坦克封装类
     * @param g 画图的g
     */
    public static void DrawBullets(Tank tank, Graphics g) {
//        DrawBullet(myHero.getX(),myHero.getY(),myHero);
        if (tank!=null) {
            //判断坦克类型是敌人还是
            if (tank.getType() == 0) {
                MyHero myHero = (MyHero) tank; //向下转换成玩家类型
                //判断玩家是否还存在
                if (myHero.isIstrue()){
                    //多个子弹绘画
                    if (myHero.getBullets()!=null){
                        for (int i = 0; i < myHero.getBullets().size(); i++) {
                            //如果子弹纯在
                            if (myHero.getBullets()!=null&&myHero.getBullets().get(i).isLive){
                                //画子弹的方法
                                DrawBullet(myHero.getBullets().get(i).getX(),myHero.getBullets().get(i).getY(),myHero.getBullets().get(i).getDirection(),0,g);
                            }else {
                                //如果子弹不存在
                                myHero.getBullets().remove(i);
                            }
                        }
                    }else {
                        //单个子弹
                        if ((myHero.getBullet() != null && myHero.getBullet().isLive == true)) {
                            DrawBullet(myHero.getBullet().getX(), myHero.getBullet().getY(), myHero.getDrection(), 0, g);
                        }
                    }
                }

            }else if (tank.getType()==1){
                //向下转换成敌人坦克
                    EnemyTank enemyTank = (EnemyTank) tank;
                    //取出多个子弹
                    for (int i = 0; i < enemyTank.getBullets().size(); i++) {
                        if (enemyTank.getBullets().get(i).isLive) {
                            //画子弹
                            DrawBullet(enemyTank.getBullets().get(i).getX(), enemyTank.getBullets().get(i).getY(), enemyTank.getDrection(), 1, g);
                        } else {
                            enemyTank.getBullets().remove(i);
                        }
                    }

            }
            else {
                System.out.println("没有写");
            }
        }
    }

    /**
     *
     * @Description: 画敌人所有类型坦克
     * @author sosmcc
     * @param enemyTanks 你自己的多个坦克封装类（Vector）
     * @param g 画图的g
     */
    public static void DrawAllEnemyTank(Vector<EnemyTank> enemyTanks, Graphics g) {
        for (int i = 0; i < enemyTanks.size(); i++) {
            //取出坦克
            EnemyTank enemyTank = enemyTanks.get(i);
            //判断敌人是否存活
            if (enemyTank.isLive()) { //纯在则画敌人，不纯在就消失
                //画敌人ranked
                DrawAll.DrawTankEnemy(enemyTank,g);
                //画敌人子弹并判断
                DrawAll.DrawBullets(enemyTank,g);
            }
        }
    }

    /**
     *
     * @Description: 画炸弹
     * @author sosmcc
     * @param booms 你自己的多个坦克封装类（Vector）
     * @param g 画图的g
     * @param t ImageObserver一般使用this
     */
    public static void DrawBooms(Vector<Boom> booms, Graphics g,ImageObserver t) {
        if (temp==0){
            booms.add(new Boom(100,100));
            temp++;
        }
        for (int i = 0; i < booms.size(); i++) {
            Boom boom = booms.get(i);
            if (boom.getLife()>8){
                DrawAll.DrawBoom(boom.getX(),boom.getY(),g, initBoomPicture.BoomStrat(),t);
            }else if (boom.getLife()>6){
                DrawAll.DrawBoom(boom.getX(),boom.getY(),g, initBoomPicture.boomprocess(),t);
            }else if (boom.getLife()>3){
                DrawAll.DrawBoom(boom.getX(),boom.getY(),g, initBoomPicture.boomprocess_2(),t);
            }else {
                DrawAll.DrawBoom(boom.getX(),boom.getY(),g, initBoomPicture.boomprocessEnd(),t);
            }
            //减少炸弹生命值
            boom.reduceLive();
            //如果boom life 为0 删除炸弹效果
            if (boom.getLife()==0){
                booms.remove(boom);
//                if (!enemyTanks.get(i).isLive()){
//                    enemyTanks.remove(i);
//                }
            }
        }
    }

    //画记录表
    public static void drawInfomation(Graphics g){
        g.setColor(Color.black);
        Font font = new Font("宋体", 1020, 30);
        g.setFont(font);
        g.drawString("您累计击杀坦克：",1020,30);
        DrawTank(1020,60,g,0,1);
        g.setColor(Color.black);
        g.drawString(Recorder.getDestroyEnemyTankNum()+"",1080,100);
    }
}

